﻿// 局域网.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

/*

http://ybt.ssoier.cn:8088/problem_show.php?pid=1391
【题目描述】
某个局域网内有n(n≤100)台计算机，由于搭建局域网时工作人员的疏忽，现在局域网内的连接形成了回路，
我们知道如果局域网形成回路那么数据将不停的在回路内传输， 
造成网络卡的现象。因为连接计算机的网线本身不同，所以有一些连线不是很畅通，
我们用f(i,j)表示i,j之间连接的畅通程度(f(i,j)≤1000)，f(i,j)值越小表示i,j之间连接越通畅，f(i,j)为0表示i,j之间无网线连接。
现在我们需要解决回路问题，我们将除去一些连线，使得网络中没有回路，并且被除去网线的Σf(i,j)最大，请求出这个最大值。

【输入】
第一行两个正整数n,k
接下来的k行每行三个正整数i,j,m表示i,j两台计算机之间有网线联通，通畅程度为m。

【输出】
一个正整数，Σf(i,j)的最大值。

【输入样例】
5 5
1 2 8
1 3 1
1 5 3
2 4 5
3 4 2
【输出样例】
8
*/


#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>

using  namespace std;

const int N = 100 + 5; // 点数上限
const int M = 10010;
const int INF = 0x3f3f3f3f;
int n, m;       // n是点数，m是边数
int p[N];       // 并查集的父节点数组
int total;

struct Edge     // 存储边
{
    int a, b, w;

    bool operator< (const Edge& W)const
    {
        return w < W.w;
    }
}edges[M];

int find(int x)     // 并查集核心操作
{
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
}


int kruskal()
{
    sort(edges, edges + m);

    for (int i = 1; i <= n; i++) p[i] = i;    // 初始化并查集

    int res = 0, cnt = 0;
    for (int i = 0; i < m; i++)
    {
        int a = edges[i].a, b = edges[i].b, w = edges[i].w;

        a = find(a), b = find(b);
        if (a != b)     // 如果两个连通块不连通，则将这两个连通块合并
        {
            p[a] = b;
            res += w;
            cnt++;
        }
    }

    if (cnt < n - 1) return INF;
    return res;
}
 
int main()
{
    cin >> n >> m;
    for (int i = 0; i < m; i++) {
        int a, b, w; cin >> a >> b >> w;
        edges[i].a = a; edges[i].b = b; edges[i].w = w;
        total += w;
    }
    int ans = kruskal();

    cout << total-ans << endl;

	return 0;
}

 